package ar.uba.fi.tonyvaliente.signature.query;

import java.util.BitSet;
import java.util.List;

import ar.uba.fi.tonyvaliente.signature.HashFunction;

/**
 * Representa un filtro generico para aplicar sobre
 * una signature. Permite evaluar si la misma coincide
 * o no con los criterios de busqueda.
 * No descarta falsos positivos.
 *  
 * @author dmorello
 */
public abstract class SignatureFilter {

	/*
	 * Indica si el filtro esta negado, es decir,
	 * si hay que descartar los resultados que cumplen
	 * con la condicion en lugar de los que no la cumplen.
	 */
	private boolean negated;
	
	// Atributos auxiliares para crear firmas de terminos
	protected List<HashFunction> hashFunctions;
	protected int hashLength;
	
	/**
	 * Crea una nueva instancia
	 * @param negated flag de negacion de condicion
	 */
	protected SignatureFilter(boolean negated) {
		this.negated = negated;
	}
	
	/**
	 * Devuelve el valor del flag de negacion
	 * @return el valor del flag de negacion
	 */
	public final boolean isNegated() {
		return negated;
	}
	
	/**
	 * Invierte el valor del flag de negacion
	 */
	public final void invertNegatedFlag() {
		negated = !negated;
	}
	
	/**
	 * Evalua una signature (BitSet) y dice si cumple
	 * o no la condicion. Para ello tiene en cuenta el
	 * valor de flag negated seteado por el constructor.
	 * @param docSignature La signature que se quiere evaluar
	 * @return <code>true</code> si la firma cumple con la
	 * condicion (o si es falso positivo), <code>false</code>
	 * en otro caso.
	 */
	public abstract boolean eval(BitSet docSignature, List<HashFunction> hashFunctions, int hashLength) throws SignatureQueryException;
}
